2013-05-16 16 views
5

In breve: ho bisogno di ottenere la data dell'ultima modifica in un file ospitato su Github.Verificare se esiste una versione più recente del mio file locale in Github, con R

In long: dato che in Github ho un file (uno spazio di lavoro R) che una volta ogni tanto viene aggiornato, vorrei creare una funzione in R che controlli se il mio file locale è precedente a quello nel repo (se sei curioso, la mia motivazione è esposta alla fine di questo post). This is the file Sto parlando.

In linea di principio dovrebbe essere abbastanza semplice, poiché ad ogni file è associato un history page, ma la mia conoscenza è troppo scarsa per sapere cosa fare con questo. Inoltre, this Q sembra suggerire in qualche modo di fare quello che voglio usando php, ma quella è terra incognita per me davvero, quindi non so se potrebbe aiutare in alcun modo.

Quindi, come ho detto nella versione breve di questo post, ho bisogno di trovare un modo per recuperare la data dell'ultimo commit per questo file. Posso trovare un modo per confrontarlo in seguito alla data di commit del mio file locale.

Grazie in anticipo, Juan

motivazione: Sto lavorando in un un corso online in basi R che utilizza un sistema di auto-controllare se le soluzioni di esercizi siano corretti (es: gli studenti possono controllare i loro risultati all'istante). Questo sistema utilizza un file con funzioni e dati che viene regolarmente aggiornato perché spesso trovo bug e nuovi problemi. Quindi il mio obiettivo è avere una funzione per dire agli studenti se c'è un nuovo file disponibile. Sarebbe anche bello trovare un modo per scaricarlo e sostituire il vecchio, ma questo è secondario ora.

risposta

2

Il problema è mantenere il git-time del download. La soluzione seguente imposta il tempo del file alla data Git dopo ogni download per il controllo successivo.

library(RCurl) 
library(rjson) 
destination = "datos" # assume current directory 
repo = "https://api.github.com/repos/jumanbar/Curso-R/" 
path = "ejercicios-de-programacion/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") 
} 

Sembra da R il useragent e ssl.verifypeer è richiesto; funziona senza dalla riga di comando. Se sei attento alla sicurezza, c'è una documentazione su questo argomento che gira intorno, ma ho preso la strada facile da impegnare.

+0

Questo è meraviglioso grazie! Non riesco ancora a scaricare il file da R e non so davvero cosa fare delle opzioni 'useragent' o' ssl.verifypeer'. Per il primo ho provato "Mozilla/5.0" senza successo. Quando viene eseguito 'download.file', viene visualizzato il messaggio" download aveva stato di uscita diverso da zero "utilizzando' method = "wget" 'o' "curl" 'e" schema URL non supportato "(tradotto dallo spagnolo). Ad ogni modo, questo è quello per cui stavo saltellando. – Juan

+0

Prova a inserire la stringa da rawfile nel browser e controlla se puoi scaricarla in questo modo quando accedi a github. –

+0

Infatti posso ... – Juan

2

Sembra che sia necessario un clone locale del repository Github. Dimenticando le specifiche linguistiche di R per il momento (non so R), in git puoi ottenere la data più recente in vari modi tramite git log. Dal file git log aiuto (git help log), sotto la sezione segnaposto:

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

È possibile recuperare il timestamp UNIX (secondi dall'inizio del 1 gennaio 1970 - molto facilmente confrontabili) del più recente impegnarsi per il file , a partire dalla radice del progetto, con il git log comando seguente:

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

che restituisce un numero, ad esempio 1368691710, ma è possibile utilizzare anche gli altri formati elencati.

Ora è sufficiente trovare un modo per effettuare questa chiamata di sistema da R, con la radice del progetto come directory di lavoro. This SO post può aiutare (ma ancora una volta, io non R).

+0

Ciò funzionerebbe sicuramente nel mio computer ma non in altri (PC studenti), quindi non è una soluzione valida in questo caso. Grazie comunque. – Juan

0

Forse si può fare uso del comando "git status" (che ti dice se ci sono nuovi commit) im combinazione con cronjobs. Ma hai bisogno di un clone locale per questo. E non ho mai provato a usare l'output del comando all'interno di un cronjob.

+0

Se nel telecomando ci sono nuovi commit che non sono stati recuperati, 'git status' non lo dirà. Devi 'git fetch' prima. –

Problemi correlati