@@ -1401,14 +1401,17 @@ func (srv *Server) ImagePull(job *engine.Job) engine.Status {
14011401}
14021402
14031403// Retrieve the all the images to be uploaded in the correct order
1404- func (srv * Server ) getImageList (localRepo map [string ]string ) ([]string , map [string ][]string , error ) {
1404+ func (srv * Server ) getImageList (localRepo map [string ]string , requestedTag string ) ([]string , map [string ][]string , error ) {
14051405 var (
14061406 imageList []string
14071407 imagesSeen map [string ]bool = make (map [string ]bool )
14081408 tagsByImage map [string ][]string = make (map [string ][]string )
14091409 )
14101410
14111411 for tag , id := range localRepo {
1412+ if requestedTag != "" && requestedTag != tag {
1413+ continue
1414+ }
14121415 var imageListForThisTag []string
14131416
14141417 tagsByImage [id ] = append (tagsByImage [id ], tag )
@@ -1435,25 +1438,29 @@ func (srv *Server) getImageList(localRepo map[string]string) ([]string, map[stri
14351438 // append to main image list
14361439 imageList = append (imageList , imageListForThisTag ... )
14371440 }
1438-
1441+ if len (imageList ) == 0 {
1442+ return nil , nil , fmt .Errorf ("No images found for the requested repository / tag" )
1443+ }
14391444 utils .Debugf ("Image list: %v" , imageList )
14401445 utils .Debugf ("Tags by image: %v" , tagsByImage )
14411446
14421447 return imageList , tagsByImage , nil
14431448}
14441449
1445- func (srv * Server ) pushRepository (r * registry.Registry , out io.Writer , localName , remoteName string , localRepo map [string ]string , sf * utils.StreamFormatter ) error {
1450+ func (srv * Server ) pushRepository (r * registry.Registry , out io.Writer , localName , remoteName string , localRepo map [string ]string , tag string , sf * utils.StreamFormatter ) error {
14461451 out = utils .NewWriteFlusher (out )
14471452 utils .Debugf ("Local repo: %s" , localRepo )
1448- imgList , tagsByImage , err := srv .getImageList (localRepo )
1453+ imgList , tagsByImage , err := srv .getImageList (localRepo , tag )
14491454 if err != nil {
14501455 return err
14511456 }
14521457
14531458 out .Write (sf .FormatStatus ("" , "Sending image list" ))
14541459
1455- var repoData * registry.RepositoryData
1456- var imageIndex []* registry.ImgData
1460+ var (
1461+ repoData * registry.RepositoryData
1462+ imageIndex []* registry.ImgData
1463+ )
14571464
14581465 for _ , imgId := range imgList {
14591466 if tags , exists := tagsByImage [imgId ]; exists {
@@ -1488,8 +1495,12 @@ func (srv *Server) pushRepository(r *registry.Registry, out io.Writer, localName
14881495 return err
14891496 }
14901497
1498+ nTag := 1
1499+ if tag == "" {
1500+ nTag = len (localRepo )
1501+ }
14911502 for _ , ep := range repoData .Endpoints {
1492- out .Write (sf .FormatStatus ("" , "Pushing repository %s (%d tags)" , localName , len ( localRepo ) ))
1503+ out .Write (sf .FormatStatus ("" , "Pushing repository %s (%d tags)" , localName , nTag ))
14931504
14941505 for _ , imgId := range imgList {
14951506 if r .LookupRemoteImage (imgId , ep , repoData .Tokens ) {
@@ -1575,6 +1586,7 @@ func (srv *Server) ImagePush(job *engine.Job) engine.Status {
15751586 metaHeaders map [string ][]string
15761587 )
15771588
1589+ tag := job .Getenv ("tag" )
15781590 job .GetenvJson ("authConfig" , authConfig )
15791591 job .GetenvJson ("metaHeaders" , metaHeaders )
15801592 if _ , err := srv .poolAdd ("push" , localName ); err != nil {
@@ -1600,11 +1612,14 @@ func (srv *Server) ImagePush(job *engine.Job) engine.Status {
16001612 }
16011613
16021614 if err != nil {
1603- reposLen := len (srv .runtime .Repositories ().Repositories [localName ])
1615+ reposLen := 1
1616+ if tag == "" {
1617+ reposLen = len (srv .runtime .Repositories ().Repositories [localName ])
1618+ }
16041619 job .Stdout .Write (sf .FormatStatus ("" , "The push refers to a repository [%s] (len: %d)" , localName , reposLen ))
16051620 // If it fails, try to get the repository
16061621 if localRepo , exists := srv .runtime .Repositories ().Repositories [localName ]; exists {
1607- if err := srv .pushRepository (r , job .Stdout , localName , remoteName , localRepo , sf ); err != nil {
1622+ if err := srv .pushRepository (r , job .Stdout , localName , remoteName , localRepo , tag , sf ); err != nil {
16081623 return job .Error (err )
16091624 }
16101625 return engine .StatusOK
0 commit comments