2013-05-16 8 views
5

W skrócie: Muszę uzyskać datę ostatniej zmiany w pliku hostowanym na Github.Sprawdź, czy istnieje nowsza wersja mojego pliku lokalnego w Github, z R

Długi: biorąc pod uwagę, że w Github mam plik (przestrzeń roboczą R), który raz na jakiś czas jest aktualizowany, chciałbym utworzyć funkcję w R, która sprawdza, czy mój plik lokalny jest starszy niż ten w repo (jeśli jesteś ciekawy, moja motywacja jest ujawniona na końcu tego posta). This is the file Mówię o.

Zasadniczo powinno to być dość łatwe, ponieważ każdy plik ma skojarzony z nim history page, ale moja wiedza jest zbyt uboga, aby wiedzieć, co z tym zrobić. Również, this Q wydaje się wskazywać na jakiś sposób robienia tego, co chcę, używając php, ale to naprawdę jest dla mnie terra incognita, więc nie wiem, czy to mogłoby pomóc w jakikolwiek sposób.

Tak więc, jak napisałem w krótkiej wersji tego posta, muszę znaleźć sposób na pobranie daty ostatniego zatwierdzenia dla tego pliku. Mogę znaleźć sposób, aby później porównać go z datą zatwierdzenia pliku lokalnego.

Dzięki z góry, Juan

motywacja: Pracuję w kursie on-line w podstawach R, który wykorzystuje system do samodzielnego sprawdzenia, czy rozwiązania ćwiczeń są prawidłowe (tj: studenci mogą sprawdzić ich wyniki natychmiast). Ten system używa pliku z funkcjami i danymi, które są regularnie aktualizowane, ponieważ często znajduję błędy i nowe problemy. Moim celem jest więc przekazanie uczniom informacji, czy jest dostępny nowy plik. Byłoby również fajnie znaleźć sposób, aby go pobrać i zastąpić starszego, ale to jest teraz drugorzędne.

Odpowiedz

2

Problem polega na zachowaniu czasu git pobierania. Poniższe rozwiązanie ustawia czas pliku na datę Git po każdym pobraniu do następnej kontroli.

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") 
} 

Wygląda na to, że z R wymagany jest useragent i ssl.verifypeer; działa bez wiersza poleceń. Jeśli jesteś świadomy bezpieczeństwa, pojawia się dokumentacja dotycząca tego tematu, ale wybrałam łatwą ścieżkę do zatwierdzenia.

+0

To jest wspaniałe dzięki! Nadal nie mogę pobrać pliku z R i naprawdę nie wiem, co zrobić z opcjami 'useragent' lub' ssl.verifypeer'. Dla pierwszego próbowałem "Mozilla/5.0" bezskutecznie. Kiedy uruchamiany jest plik 'download.file ', otrzymuję komunikat" pobieranie ma niezerowy status wyjścia "za pomocą' method = "wget" 'lub' "curl" 'i" schemat URL nie jest obsługiwany "(przetłumaczony z języka hiszpańskiego). W każdym razie, właśnie to skakałem. – Juan

+0

Spróbuj umieścić ciąg z rawfile w przeglądarce i sprawdź, czy możesz go pobrać w ten sposób po zalogowaniu się do github. –

+0

Rzeczywiście mogę ... – Juan

2

Wygląda na to, że potrzebujesz lokalnego klona repozytorium github. Zapominając o języku R na chwilę (nie wiem R), w git można uzyskać najnowszą datę na wiele sposobów poprzez git log. Z akt git log pomóc (git help log), w sekcji znaczniki:

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

można pobrać znacznik czasu UNIX (w sekundach od początku dnia 1 stycznia 1970 roku - bardzo łatwo porównywalne) z najnowszym zobowiązać do pliku , począwszy od korzenia projektu, z następującym git log polecenia:

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

która zwraca liczbę, np 1368691710, ale można również użyć innych wymienionych formatów.

Teraz wystarczy znaleźć sposób, aby wykonać to wywołanie systemowe z R, z katalogiem głównym projektu jako katalog roboczy. This SO post może pomóc (ale znowu, nie R).

+0

To na pewno działa na moim komputerze, ale w innych nie (uczniowie komputery PC), więc nie jest dobrym rozwiązaniem w tym przypadku. Dzięki i tak. – Juan

0

Być może możesz skorzystać z polecenia "git status" (które powie Ci, czy są nowe zatwierdzenia) w połączeniu z cronjobs. Ale potrzebujesz do tego lokalnego klona. I nigdy nie próbowałem używać wyjścia polecenia wewnątrz cronjob.

+0

Jeśli na pilocie są nowe zatwierdzenia, które nie zostały pobrane, "status git" nie powie ci. Najpierw musisz "git fetch". –