{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Qué te deja hacer una licencia\n",
    "\n",
    "Que sea público no significa que sea tuyo, y viceversa\n",
    "\n",
    "Cuaderno de soluciones del capítulo 16 de **Git desde cero**, de Miss Yera.\n",
    "\n",
    "Corre de arriba abajo. Si lo abres en Google Colab no necesitas instalar nada.\n",
    "\n",
    "Capítulo completo: https://missyera.com/guias/git-desde-cero/licencias/\n",
    "\n",
    "Este es el cuaderno de **soluciones**. Trae el código de cada ejercicio, la\n",
    "explicación de la trampa y la respuesta del quiz. Si vienes del cuaderno de\n",
    "práctica sin haberlo intentado, vuelve 🙂"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Este capítulo lo escribo con una advertencia por delante: no soy abogada y\n",
    "esto no es asesoría legal. Es lo que necesitas saber para no meter la pata con\n",
    "un cliente, que es distinto 👩‍⚖️\n",
    "\n",
    "Y la pata más común es esta: *\"está en GitHub, es público, lo uso\"*."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Público no es libre"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Cuando alguien escribe algo, ese algo es suyo desde el momento en que lo\n",
    "escribe. No hace falta registrar nada. Publicarlo en internet lo hace\n",
    "**visible**, no gratis.\n",
    "\n",
    "Por eso, si un repositorio no tiene licencia, la respuesta por defecto es\n",
    "\"todos los derechos reservados\". Los propios términos de GitHub dicen que\n",
    "subiendo algo público le das a los demás el derecho de verlo y de bifurcarlo\n",
    "dentro de GitHub, y nada más. Ni usarlo en tu trabajo, ni copiarlo dentro de un\n",
    "proyecto que cobras.\n",
    "\n",
    "La licencia es justamente el permiso que el autor da por adelantado, para no\n",
    "tener que contestar correos uno por uno 📜"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Las tres que vas a encontrar"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "| Licencia | Puedo usarlo en algo que cobro | Tengo que abrir mi código | La reconoces por |\n",
    "|---|---|---|---|\n",
    "| MIT | Sí | No | Es cortita, cabe en una pantalla |\n",
    "| Apache 2.0 | Sí | No | Larga, habla de patentes |\n",
    "| GPL v3 | Sí | Sí, si lo distribuyes | Habla de \"copyleft\" |\n",
    "| Sin archivo | No | - | No hay LICENSE en la raíz |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "MIT y Apache dicen básicamente \"haz lo que quieras, no me demandes si se\n",
    "rompe, y deja mi nombre en el aviso\". GPL dice \"haz lo que quieras, pero si\n",
    "entregas algo construido encima de esto, ese algo también tiene que ser\n",
    "abierto\".\n",
    "\n",
    "Esa última fila es la que importa en el trabajo: si vas a entregarle a un\n",
    "cliente algo que lleva dentro una librería GPL, esa es una conversación que hay\n",
    "que tener antes y no después ⚠️"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Mirar la licencia desde la terminal"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Armamos un proyecto con licencia para verlo:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "mkdir reporte-ventas\n",
    "cd reporte-ventas\n",
    "git init -q\n",
    "printf 'ciudad,monto\\nLima,1200\\nArequipa,890\\n' > ventas.csv\n",
    "printf '# Reporte de ventas\\n' > README.md\n",
    "git add .\n",
    "git commit -q -m \"Primera version del reporte de ventas\"\n",
    "ls\n",
    "test -f LICENSE && echo \"tiene licencia\" || echo \"sin licencia, ojo\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ese `test -f LICENSE` es la revisión de cinco segundos que hago\n",
    "antes de usar cualquier cosa ajena en un proyecto de cliente 🔎"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ponerle una a lo tuyo"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "En GitHub hay un asistente (*Add file > Create new file*, escribe\n",
    "`LICENSE` y aparece un botón para elegir). Desde la terminal es un\n",
    "archivo de texto y ya:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "printf 'MIT License\\n\\nCopyright (c) 2026 Gera Flores\\n\\nPermission is hereby granted, free of charge, to any person obtaining a copy\\nof this software and associated documentation files (the \"Software\"), to deal\\nin the Software without restriction.\\n' > LICENSE\n",
    "git add LICENSE\n",
    "git commit -q -m \"Se agrega la licencia MIT\"\n",
    "head -3 LICENSE\n",
    "git log --oneline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "El texto completo de MIT son unas veinte líneas y se copia tal cual desde\n",
    "[opensource.org](https://opensource.org/license/mit). Lo único que se cambia es el año y el\n",
    "nombre 📝"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Cuando el archivo se llama de otra forma"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "git mv LICENSE LICENCIA.txt\n",
    "git commit -q -m \"Se traduce el nombre del archivo de licencia\"\n",
    "ls\n",
    "git log --oneline -1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Funciona, pero no lo hagas. GitHub reconoce el archivo por el nombre\n",
    "`LICENSE` y es lo que muestra en la barra lateral del proyecto. Con\n",
    "otro nombre, tu licencia existe y nadie la ve."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "git mv LICENCIA.txt LICENSE\n",
    "git commit -q -m \"Vuelve a llamarse LICENSE, que es lo que GitHub reconoce\"\n",
    "ls"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Qué hacer si el proyecto que quieres no tiene licencia"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Preguntar. Se abre un issue de tres líneas, sin drama:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "Hola! Me gustaría usar esto en un proyecto de trabajo.\n",
    "¿Podrías agregarle una licencia para saber qué está permitido?\n",
    "Gracias por publicarlo 🙌\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "La mitad de las veces es un olvido y lo resuelven el mismo día. Y si nadie\n",
    "contesta en dos semanas, esa también es una respuesta 🤷‍♀️"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### La trampa\n",
    "\n",
    "Encuentras en GitHub un script que hace exactamente el reporte de ventas que te pidió tu cliente. No tiene licencia, pero es público, así que lo usas.\n",
    "\n",
    "```\n",
    "$ ls\n",
    "README.md  reporte.py  requirements.txt\n",
    "\n",
    "$ ls LICENSE\n",
    "ls: cannot access 'LICENSE': No such file or directory\n",
    "```\n",
    "\n",
    "**Qué está mal**\n",
    "\n",
    "Sin licencia no es \"libre\", es **todos los derechos reservados** ⚖️\n",
    "\n",
    "Es al revés de lo que parece: publicar algo no lo regala. Por defecto la obra es de su autor, y que esté visible en internet no te da permiso para usarla, ni para copiarla dentro de un trabajo que cobras.\n",
    "\n",
    "GitHub lo dice en sus propios términos: lo público se puede ver y se puede bifurcar dentro de GitHub, y nada más.\n",
    "\n",
    "La salida no es dejar de usarlo, es **preguntar**: se abre un issue amable pidiendo que le pongan una licencia. Casi siempre es un olvido y se resuelve en un día."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Comprueba que se entendió"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Comprueba que lo tienes\n",
    "\n",
    "Encuentras un script público en GitHub, sin archivo LICENSE, que resuelve el reporte que te pidió un cliente. ¿Qué puedes hacer?\n",
    "\n",
    "a) Usarlo, es público\n",
    "\n",
    "b) Mirarlo y aprender de él, pero no usarlo sin preguntar\n",
    "\n",
    "c) Usarlo si lo cambio bastante\n",
    "\n",
    "d) Usarlo si menciono al autor\n",
    "\n",
    "---\n",
    "\n",
    "**La correcta es la b.**\n",
    "\n",
    "*a)* Público significa visible. Sin licencia, los derechos siguen siendo del autor.\n",
    "\n",
    "*c)* Cambiarlo lo convierte en una obra derivada, que sigue necesitando permiso del original.\n",
    "\n",
    "*d)* Citar es de buena educación, pero no sustituye al permiso. La atribución es una condición de algunas licencias, no un reemplazo de tenerlas.\n",
    "\n",
    "Sin LICENSE, se pregunta. Y preguntar cuesta tres líneas ✉️"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ejercicios"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. Revisa si un proyecto tiene licencia\n",
    "\n",
    "Crea el catálogo de bodegas sin licencia y hazle la\n",
    "revisión de cinco segundos."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "cd ..\n",
    "mkdir catalogo-bodegas\n",
    "cd catalogo-bodegas\n",
    "git init -q\n",
    "printf 'bodega,ciudad\\nBodega Inti,Cusco\\n' > bodegas.csv\n",
    "git add bodegas.csv\n",
    "git commit -q -m \"Catalogo de bodegas de Cusco\"\n",
    "ls\n",
    "test -f LICENSE && echo \"tiene licencia\" || echo \"sin licencia\"\n",
    "bodegas.csv\n",
    "sin licencia\n",
    "Sin licencia. Si fuera de otra persona, tocaría preguntar antes de usarlo."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. Ponle MIT\n",
    "\n",
    "Agrega la licencia y guárdala en su propio commit."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "printf 'MIT License\\n\\nCopyright (c) 2026 Gera Flores\\n' > LICENSE\n",
    "git add LICENSE\n",
    "git commit -q -m \"Se agrega la licencia MIT\"\n",
    "git log --oneline\n",
    "cat LICENSE\n",
    "061ce9d Se agrega la licencia MIT\n",
    "ffd8667 Catalogo de bodegas de Cusco\n",
    "MIT License\n",
    "\n",
    "Copyright (c) 2026 Gera Flores\n",
    "Un commit aparte para la licencia, porque es una decisión y no un detalle."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. Comprueba el año y el nombre\n",
    "\n",
    "Lo único que se personaliza de MIT es la línea del\n",
    "copyright."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "grep Copyright LICENSE\n",
    "Copyright (c) 2026 Gera Flores\n",
    "Si copias una licencia y te olvidas de cambiar esa línea, estás declarando\n",
    "que la obra es de otra persona 🙈"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. Mira cuándo se agregó\n",
    "\n",
    "La historia de un solo archivo, que ya viste en el\n",
    "capítulo 6."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "git log --oneline -- LICENSE\n",
    "061ce9d Se agrega la licencia MIT\n",
    "Útil en proyectos ajenos: te dice si la licencia estuvo desde el principio o\n",
    "si se agregó después, que cambia qué cubre."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. Prueba a renombrarla\n",
    "\n",
    "Cámbiale el nombre y vuelve a dejarla como estaba."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "git mv LICENSE licencia.md\n",
    "git commit -q -m \"Se prueba otro nombre para la licencia\"\n",
    "ls\n",
    "git mv licencia.md LICENSE\n",
    "git commit -q -m \"Vuelve a LICENSE, que es el nombre que GitHub reconoce\"\n",
    "ls\n",
    "bodegas.csv\n",
    "licencia.md\n",
    "LICENSE\n",
    "bodegas.csv\n",
    "El nombre exacto importa porque GitHub lo busca literal."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6. Busca licencias en todo un proyecto\n",
    "\n",
    "Un proyecto puede traer licencias de terceros dentro.\n",
    "Búscalas todas."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "mkdir -p vendor/libreria-ajena\n",
    "printf 'Apache License 2.0\\n' > vendor/libreria-ajena/LICENSE\n",
    "git add vendor\n",
    "git commit -q -m \"Entra una libreria de terceros con su licencia\"\n",
    "find . -name \"LICENSE*\" -not -path \"./.git/*\"\n",
    "./LICENSE\n",
    "./vendor/libreria-ajena/LICENSE\n",
    "Dos licencias en un mismo proyecto es normal. Lo que no es normal es no\n",
    "saber que están 🔍"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 7. Intenta borrar una licencia que no existe\n",
    "\n",
    "Pídele a Git que quite un archivo que el proyecto no\n",
    "tiene."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "git rm LICENCIA-VIEJA.txt\n",
    "fatal: pathspec 'LICENCIA-VIEJA.txt' did not match any files\n",
    "Git no borra a ciegas ni inventa: si el archivo no está en la historia, te\n",
    "lo dice y no toca nada 🛡️"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Lo que te llevas"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Sin LICENSE, todos los derechos reservados. Para lo tuyo, MIT; para\n",
    "lo ajeno, mira el archivo antes de usarlo.**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "\n",
    "Ese era el capítulo 16 de **Git desde cero**. El texto completo, con las salidas de cada bloque, está en https://missyera.com/guias/git-desde-cero/licencias/\n",
    "\n",
    "Que tengas lindo día! 🌸"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
