2013-10-18 6 views
9

Ho riscontrato un problema/domanda durante l'utilizzo dell'API GitHub.GitHub API (v3): Ordina i tag per data di creazione

Ho bisogno di un elenco di tutti i tag creati dopo un singolo tag. L'unico modo per farlo è confrontare i tag per data. Tuttavia, i risultati del API non sono ordinate per data:

Risultato da API (rotaie esempio repository):

API results

può derivare dalla interfaccia web:

Webinterface results

Quello che mi aspettavo è una lista ordinata per data. Tuttavia, come puoi vedere nelle immagini: l'API restituisce v4.0.0rc1 & v4.0.0rc2 prima del rilascio della v4.0.0, mentre la versione 4.0.0 viene rilasciata dopo le release candidate. Non c'è nemmeno una data di creazione/commit da ordinare sul lato server.

Anche l'API di rilascio non è una soluzione. Questa API restituisce solo le versioni create da Github, non le versioni create dai tag.

Esiste un modo per ordinare i tag in base alla data?

Grazie in anticipo!

Ruben

risposta

9

Il Repositories API attualmente restituisce i tag nell'ordine in cui sarebbero stati restituiti dal comando "tag git", che significa che sono in ordine alfabetico ordinati.

Il problema con i tag di ordinamento cronologico in Git è che ci sono due tipi di tag, leggeri e annotati, e per il tipo leggero Git non memorizza la data di creazione.

Le versioni/tag UI attualmente ordina i tag in ordine cronologico in base alla data del commit a cui il tag punta. Anche in questo caso non è la data in cui il tag stesso è stato creato, ma stabilisce un ordine cronologico delle cose.

L'aggiunta di questa alternativa di ordinamento all'API si trova nell'elenco delle nostre richieste di funzionalità.

+2

Qualcosa di nuovo qui? Sarebbe bello ottenere le tag ordinamento per data :) – davidmatas

+0

@davidmatas No. –

3

Come soluzione alternativa, c'è un modulo nodo per questo, che recupera sostanzialmente il commit dettagli di ogni tag: github-api-tags-full

> npm install github-api-tags-full github moment 

var GitHubApi = require('github'), 
moment  = require('moment'), 
githubTags = require('github-api-tags-full'); 

var github = new GitHubApi({ 
    version: '3.0.0' 
}); 

githubTags({ user: 'golang', repo: 'go' }, github) 
.then(function(tags) { 
    var tagsSorted = tags.sort(byAuthorDateAsc).reverse(); // descending 
    console.log(tagsSorted); // prints the array of tags sorted by their creation date 
}); 

var byAuthorDateAsc = function(tagA, tagB) { 
    return githubCompareDates(
    tagA.commit.author.date, 
    tagB.commit.author.date 
); 
}; 
var githubCompareDates = function(dateStrA, dateStrB) { 
    return moment(dateStrA).diff(dateStrB); 
}; 

Con i migliori saluti

Modifica: c'è ora un modo più semplice Con la nuova API Github GraphQL?

+1

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - [Dalla recensione] (/ recensione/post di bassa qualità/10532153) –

+1

Ho aggiunto il codice direttamente al post ora. :) – strarsis

2

Con GraphQL API v4, ora è possibile filtrare i tag in base alla data di commit con field: TAG_COMMIT_DATE all'interno di orderBy.Di seguito eseguirà ascendente tipo di tag di commit Data:

{ 
    repository(owner: "rails", name: "rails") { 
    refs(refPrefix: "refs/tags/", last: 100, orderBy: {field: TAG_COMMIT_DATE, direction: ASC}) { 
     edges { 
     node { 
      name 
      target { 
      oid 
      ... on Tag { 
       message 
       commitUrl 
       tagger { 
       name 
       email 
       date 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Test it in the explorer

Qui, il campo tagger all'interno target saranno riempiti solo per tag annotated & sarà vuoto per tag leggeri.

Come date proprietà a tagger dà la data di creazione del tag (solo per tag annotated), è possibile filtrare per data di creazione sul lato client facilmente (senza dover recuperare tutti i tag 1 di 1)

si noti che le opzioni disponibili per orderBy.field in questo momento sono TAG_COMMIT_DATE & ALPHABETICAL (senza TAG_CREATION_DATE)