75 lines
2.7 KiB
Go
75 lines
2.7 KiB
Go
package composer
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"io"
|
|
|
|
"github.com/FAU-CDI/wisski-distillery/internal/wisski/ingredient"
|
|
"github.com/FAU-CDI/wisski-distillery/internal/wisski/ingredient/barrel"
|
|
"github.com/FAU-CDI/wisski-distillery/internal/wisski/ingredient/barrel/drush"
|
|
"github.com/FAU-CDI/wisski-distillery/internal/wisski/ingredient/mstore"
|
|
"github.com/tkw1536/pkglib/stream"
|
|
)
|
|
|
|
// Drush implements commands related to drush
|
|
type Composer struct {
|
|
ingredient.Base
|
|
Dependencies struct {
|
|
Barrel *barrel.Barrel
|
|
MStore *mstore.MStore
|
|
Drush *drush.Drush
|
|
}
|
|
}
|
|
|
|
// Exec executes a composer command for the main composer package.
|
|
// Returns an error iff composer does not exit with 0.
|
|
func (composer *Composer) Exec(ctx context.Context, progress io.Writer, command ...string) error {
|
|
return composer.exec(ctx, progress, append([]string{"--working-dir", barrel.ComposerDirectory}, command...)...)
|
|
}
|
|
|
|
// Exec executes a composer command for the wisski directory.
|
|
// Returns an error iff composer does not exit with 0.
|
|
func (composer *Composer) ExecWissKI(ctx context.Context, progress io.Writer, command ...string) error {
|
|
return composer.exec(ctx, progress, append([]string{"--working-dir", barrel.WissKIDirectory}, command...)...)
|
|
}
|
|
|
|
func (composer *Composer) exec(ctx context.Context, progress io.Writer, command ...string) error {
|
|
if err := composer.Dependencies.Barrel.ShellScript(ctx, stream.NonInteractive(progress), append([]string{"composer", "--no-interaction"}, command...)...); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// FixPermissions fixes the permissions of the sites directory.
|
|
// This needs to be run after every installation of a composer module.
|
|
func (composer *Composer) FixPermission(ctx context.Context, progress io.Writer) error {
|
|
composer.Dependencies.Barrel.ShellScript(ctx, stream.NonInteractive(progress), "chmod", "-R", "u+w", barrel.SitesDirectory)
|
|
return nil
|
|
}
|
|
|
|
// Install attempts runs 'composer require' with the given arguments
|
|
// Spec is like a specification on the command line.
|
|
func (composer *Composer) Install(ctx context.Context, progress io.Writer, args ...string) error {
|
|
if err := composer.FixPermission(ctx, progress); err != nil {
|
|
return err
|
|
}
|
|
|
|
requires := append([]string{"require"}, args...)
|
|
if err := composer.Exec(ctx, progress, requires...); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
var ErrNotInstalled = errors.New("Composer: Not installed")
|
|
|
|
// TryInstall attempts to install the given package.
|
|
// If it cannot be installed, returns ErrNotInstalled.
|
|
func (composer *Composer) TryInstall(ctx context.Context, progress io.Writer, spec string) error {
|
|
if err := composer.Exec(ctx, io.Discard, "require", "--dry-run", spec); err != nil {
|
|
return ErrNotInstalled
|
|
}
|
|
|
|
return composer.Install(ctx, progress, spec)
|
|
}
|