Comtesting si hay una versión más nueva de mi file local en Github, con R

En resumen: necesito get la date del último cambio en un file alojado en Github.

En largo: dado que en Github tengo un file (un espacio de trabajo R) que de vez en cuando se actualiza, me gustaría crear una function en R que compruebe si mi file local es más antiguo que el del repository (si es curioso, mi motivación está expuesta al final de esta publicación). Este es el file del que estoy hablando.

En principio, debería ser algo fácil, ya que cada file tiene una página de historial asociada, pero mi conocimiento es demasiado pobre para saber qué hacer con esto. Además, esta Q parece indicar una forma de hacer lo que quiero usando php, pero eso es terriblemente incógnito para mí, así que no sé si podría ayudar de alguna manera.

Entonces, como dije en la versión corta de esta publicación, necesito encontrar una manera de recuperar la date de la última confirmación para este file. Puedo encontrar alguna forma de compararlo con la date de compromiso de mi file local después.

Gracias de antemano, Juan

motivación : estoy trabajando en un curso en línea en R básicos que utiliza un sistema para autoverificar si las soluciones de ejercicios son correctas (es decir, los estudiantes pueden verificar sus resultados al instante). Este sistema usa un file con funciones y datos que se actualiza regularmente porque a menudo encuentro errores y nuevos problemas. Entonces mi objective es tener una function para decirles a los estudiantes si hay un file más nuevo disponible. También sería bueno encontrar la forma de downloadlo y replacelo, pero ahora es secundario.

El problema es mantener el time de git de la descarga. La siguiente solución establece la hora del file en la date de Git después de cada descarga para el próximo control.

library(RCurl) library(rjson) destination = "datos" # assume current directory repo = "https://api.github.com/repos/jumanbar/Curso-R/" path = "ejercicios-de-progtwigcion/rep-3/datos" myopts = curlOptions(useragent="whatever",ssl.verifypeer=FALSE) d = fromJSON(getURL(paste0(repo,"commits?path=",path), useragent="whatever",ssl.verifypeer=FALSE))[[1]] gitDate = as.POSIXct(d$commit$author$date) MustDownload = !file.exists(destination) | file.info(destination)$mtime > gitDate if (MustDownload){ url = d$url commit = fromJSON(getURL(url, .opts=myopts)) files = unlist(lapply(commit$files,"[[","filename")) rawfile = commit$files[[which(files==path)]]$raw_url download.file(rawfile,destination,quiet=TRUE) Sys.setFileTime(destination,gitDate) print("File was downloaded") } 

Parece que de R se requiere useragent y ssl.verifypeer; funciona sin desde la línea de command. Si eres consciente de la security, hay documentation sobre ese tema, pero tomé la ruta más fácil para comprometerme.

Parece que necesitas un clon local del repository github. Olvidando por el momento los detalles del lenguaje de R (no sé R), en git puedes get la date más reciente de varias maneras a través de git log . Desde el file de ayuda de git log ayuda de git help log ), en la sección Marcadores de position:

 %cd: committer date %cD: committer date, RFC2822 style %cr: committer date, relative %ct: committer date, UNIX timestamp %ci: committer date, ISO 8601 format 

Puede recuperar la timestamp de UNIX (segundos desde el inicio del 1 de enero de 1970, muy fácilmente comparable) de la confirmación más reciente para su file, comenzando desde la raíz del proyecto, con el siguiente command de git log :

 git log --format=%ct -1 -- ejercicios-de-progtwigcion/rep-3/datos 

Eso devuelve un número, por ejemplo, 1368691710, pero también puede usar los otros formattings enumerados.

Ahora solo necesita encontrar una forma de hacer que este sistema llame desde R, con su raíz de proyecto como el directory de trabajo. Esta publicación de SO puede ayudar (pero de nuevo, yo no R).

Tal vez puedas utilizar el command "estado de git" (que te dice si hay nuevos commits) im combinación con cronjobs. Pero necesitas un clon local para esto. Y nunca intenté usar la salida del command dentro de un cronjob.